home *** CD-ROM | disk | FTP | other *** search
/ Aminet 48 / Aminet 48 (2002)(GTI - Schatztruhe)[!][Apr 2002].iso / Aminet / dev / src / expat-src.lha / expat-1.95.2 / xmlwf / ct.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-07-28  |  2.5 KB  |  146 lines

  1. #define CHARSET_MAX 41
  2.  
  3. static
  4. const char *getTok(const char **pp)
  5. {
  6.   enum { inAtom, inString, init, inComment };
  7.   int state = init;
  8.   const char *tokStart = 0;
  9.   for (;;) {
  10.     switch (**pp) {
  11.     case '\0':
  12.       return 0;
  13.     case ' ':
  14.     case '\r':
  15.     case '\t':
  16.     case '\n':
  17.       if (state == inAtom)
  18.     return tokStart;
  19.       break;
  20.     case '(':
  21.       if (state == inAtom)
  22.     return tokStart;
  23.       if (state != inString)
  24.     state++;
  25.       break;
  26.     case ')':
  27.       if (state > init)
  28.     --state;
  29.       else if (state != inString)
  30.     return 0;
  31.       break;
  32.     case ';':
  33.     case '/':
  34.     case '=':
  35.       if (state == inAtom)
  36.     return tokStart;
  37.       if (state == init)
  38.     return (*pp)++;
  39.       break;
  40.     case '\\':
  41.       ++*pp;
  42.       if (**pp == '\0')
  43.     return 0;
  44.       break;
  45.     case '"':
  46.       switch (state) {
  47.       case inString:
  48.     ++*pp;
  49.     return tokStart;
  50.       case inAtom:
  51.     return tokStart;
  52.       case init:
  53.     tokStart = *pp;
  54.     state = inString;
  55.     break;
  56.       }
  57.       break;
  58.     default:
  59.       if (state == init) {
  60.     tokStart = *pp;
  61.     state = inAtom;
  62.       }
  63.       break;
  64.     }
  65.     ++*pp;
  66.   }
  67.   /* not reached */
  68. }
  69.  
  70. /* key must be lowercase ASCII */
  71.  
  72. static
  73. int matchkey(const char *start, const char *end, const char *key)
  74. {
  75.   if (!start)
  76.     return 0;
  77.   for (; start != end; start++, key++)
  78.     if (*start != *key && *start != 'A' + (*key - 'a'))
  79.       return 0;
  80.   return *key == '\0';
  81. }
  82.  
  83. void getXMLCharset(const char *buf, char *charset)
  84. {
  85.   const char *next, *p;
  86.  
  87.   charset[0] = '\0';
  88.   next = buf;
  89.   p = getTok(&next);
  90.   if (matchkey(p, next, "text"))
  91.     strcpy(charset, "us-ascii");
  92.   else if (!matchkey(p, next, "application"))
  93.     return;
  94.   p = getTok(&next);
  95.   if (!p || *p != '/')
  96.     return;
  97.   p = getTok(&next);
  98.   if (matchkey(p, next, "xml"))
  99.     isXml = 1;
  100.   p = getTok(&next);
  101.   while (p) {
  102.     if (*p == ';') {
  103.       p = getTok(&next);
  104.       if (matchkey(p, next, "charset")) {
  105.     p = getTok(&next);
  106.     if (p && *p == '=') {
  107.       p = getTok(&next);
  108.       if (p) {
  109.         char *s = charset;
  110.         if (*p == '"') {
  111.           while (++p != next - 1) {
  112.         if (*p == '\\')
  113.           ++p;
  114.         if (s == charset + CHARSET_MAX - 1) {
  115.           charset[0] = '\0';
  116.           break;
  117.         }
  118.         *s++ = *p;
  119.           }
  120.           *s++ = '\0';
  121.         }
  122.         else {
  123.           if (next - p > CHARSET_MAX - 1)
  124.         break;
  125.           while (p != next)
  126.         *s++ = *p++;
  127.           *s = 0;
  128.           break;
  129.         }
  130.       }
  131.     }
  132.       }
  133.     }
  134.   else
  135.     p = getTok(&next);
  136.   }
  137. }
  138.  
  139. int main(int argc, char **argv)
  140. {
  141.   char buf[CHARSET_MAX];
  142.   getXMLCharset(argv[1], buf);
  143.   printf("charset = \"%s\"\n", buf);
  144.   return 0;
  145. }
  146.